// ============================== 导入依赖 ============================== //

import CORE from '../UTIL'
import util from './util'

const DETAIL = {
  finish: false, // 是否完成 (未完成则继续循环，已完成则清除定时器)
  tip: '', // 提示语
  num: 0, // 当前数
  total: 0, // 总数
  percent: 0, // 百分比
  success: false, // 是否成功
}
const PROGRESS = {
  ...DETAIL,
  visible: false, // 是否可见
  timer: null, // 计时器
}

// ============================== 状态集 ============================== //

const state = {
  // —————————————————————————————— 配置 —————————————————————————————— //

  /**
   * 接口
   */
  API: {
    ...util.API,

    upload: null,

    transDownParam(downParam, context) {
      return downParam
    },
    download: null,
    async getList(param, TIP) {
      throw util.errorAPI(TIP, 'getList')
    },
    dealDownload(resp) {
      //
    },
  },

  /**
   * 映射
   */
  MAP: {
    WORD: '', // 词语 (初始常量，不可更新)

    UP: null, // 上传 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    DOWN: null, // 下载 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')

    tipUp: '', // 上传提示 (有值时直接使用，无值时拼接生成)
    tipDown: '', // 下载提示 (有值时直接使用，无值时拼接生成)
  },

  /**
   * 字典
   */
  DICT: {
    //
  },

  /**
   * 初始配置
   */
  INIT_CONFIG: {
    /**
     * 上传有无进度条
     */
    UP_PRROGRESS: false,

    /**
     * 上传周期毫秒数
     */
    UP_PERIOD: 200,

    /**
     * 下载有无进度条
     */
    DOWN_PRROGRESS: false,

    /**
     * 下载周期毫秒数
     */
    DOWN_PERIOD: 200,
  },

  // —————————————————————————————— 参数 —————————————————————————————— //

  /**
   * 上传参数
   */
  upParam: {
    file: null, // 已选择的文件对象
    task: '', // 进度条的任务标识
  },

  /**
   * 下载参数
   */
  downParam: {
    task: '', // 任务
    page: 1, // 页码
    fileName: '', // 文件名
  },

  // —————————————————————————————— 进度 —————————————————————————————— //

  /**
   * 上传进度
   */
  upProgress: { ...PROGRESS },

  /**
   * 下载进度
   */
  downProgress: { ...PROGRESS },

  // —————————————————————————————— 开关 —————————————————————————————— //

  /**
   * 远程上传开关
   */
  needUpload: false,

  /**
   * 上传就绪开关
   */
  readyUpload: false,

  /**
   * 远程下载开关
   */
  needDownload: false,

  /**
   * 下载就绪开关
   */
  readyDownload: false,

  // —————————————————————————————— 进度开关 —————————————————————————————— //

  /**
   * 远程上传进度开关
   */
  needUpProgress: false,

  /**
   * 上传进度就绪开关
   */
  readyUpProgress: false,

  /**
   * 远程下载开关
   */
  needDownProgress: false,

  /**
   * 下载就绪开关
   */
  readyDownProgress: false,
}

// ============================== 计算属性 ============================== //

const getters = {}

// ============================== 同步更新 ============================== //

const mutations = {
  // —————————————————————————————— 设置 —————————————————————————————— //

  /**
   * 设置上传参数
   */
  setUpParam(state, upParam) {
    state.upParam = Object.assign({}, state.upParam, upParam)
  },

  /**
   * 设置下载参数
   */
  setDownParam(state, downParam) {
    state.downParam = Object.assign({}, state.downParam, downParam)
  },

  /**
   * 设置上传进度
   */
  setUpProgress(state, upProgress) {
    state.upProgress = Object.assign({}, state.upProgress, upProgress)
  },

  /**
   * 设置下载进度
   */
  setDownProgress(state, downProgress) {
    state.downProgress = Object.assign({}, state.downProgress, downProgress)
  },

  // —————————————————————————————— 上传—————————————————————————————— //

  /**
   * 开始远程上传
   */
  startUpload(state, file) {
    if (CORE.isFile(file)) state.upParam.file = file
    util.start('Upload', state)
  },

  /**
   * 完成远程上传
   */
  completeUpload(state, msgSuccess) {
    const { MAIN_START, INIT_CONFIG, param, upProgress } = state
    if (MAIN_START === 'startList' && !INIT_CONFIG.IS_LONG_LIST) param.page = 1 // 回到首页

    if (!INIT_CONFIG.UP_PRROGRESS) util.completeRefresh('Upload', state, msgSuccess, this) // 无进度条，完成后刷新
    else {
      util.start('UpProgress', state) // 首次查询进度

      upProgress.timer && clearInterval(upProgress.timer) // 清除旧的定时器 (如有)

      const timer = setInterval(() => { // 设置新的定时器
        if (upProgress.finish) {
          clearInterval(timer) // 清除定时器
          util.completeRefresh('Upload', state, '', this) // 完成上传
        } else {
          util.start('UpProgress', state, msgSuccess) // 继续查询进度
        }
      }, INIT_CONFIG.UP_PERIOD || 200)

      Object.assign(upProgress, DETAIL, { timer }) // 重置进度
    }
  },

  /**
   * 终止远程上传
   */
  stopUpload(state, e) {
    util.stop('Upload', state, e)
  },

  // —————————————————————————————— 下载 —————————————————————————————— //

  /**
   * 开始远程下载
   */
  startDownload(state) {
    if (state.API.validParam(state.param, state, this)) {
      util.start('Download', state)
    }
  },

  /**
   * 完成远程下载
   */
  completeDownload(state, msgSuccess) {
    const { INIT_CONFIG, downProgress } = state

    if (!INIT_CONFIG.DOWN_PRROGRESS) util.complete('Download', state, msgSuccess) // 无进度条，直接完成
    else {
      util.start('DownProgress', state) // 首次查询进度

      downProgress.timer && clearInterval(downProgress.timer) // 清除旧的定时器 (如有)

      const timer = setInterval(() => { // 设置新的定时器
        if (downProgress.finish) {
          clearInterval(timer) // 清除定时器
          util.complete('Download', state, '') // 完成上传
        } else {
          util.start('DownProgress', state) // 继续查询进度
        }
      }, INIT_CONFIG.DOWN_PERIOD || 200)

      Object.assign(downProgress, DETAIL, { timer }) // 重置进度
    }
  },

  /**
   * 终止远程下载
   */
  stopDownload(state, e) {
    util.stop('Download', state, e)
  },

  // —————————————————————————————— 上传进度—————————————————————————————— //

  /**
   * 开始远程上传进度
   */
  startUpProgress(state) {
    util.start('UpProgress', state)
  },

  /**
   * 完成远程上传进度
   */
  completeUpProgress(state, progress) {
    if (CORE.isJSON(progress)) Object.assign(state.upProgress, progress)
    util.complete('UpProgress', state, '')
  },

  /**
   * 终止远程上传进度
   */
  stopUpProgress(state, e) {
    util.stop('UpProgress', state, e)
  },

  // —————————————————————————————— 下载进度 —————————————————————————————— //

  /**
   * 开始远程下载进度
   */
  startDownProgress(state) {
    util.start('DownProgress', state)
  },

  /**
   * 完成远程下载进度
   */
  completeDownProgress(state, progress) {
    if (CORE.isJSON(progress)) Object.assign(state.downProgress, progress)
    util.complete('DownProgress', state, '')
  },

  /**
   * 终止远程下载进度
   */
  stopDownProgress(state, e) {
    util.stop('DownProgress', state, e)
  },
}

// ============================== 异步调用 ============================== //

const actions = {
  /**
   * 远程上传
   */
  async remoteUpload(context) {
    const { state: { API, MAP, upParam } } = context
    const TIP = API.transTip(MAP.tipUp, this.state.API) // 拼上根模块 API 的菜单
    const myUpParam = await API.transDownParam(upParam, context)

    if (API.upload) {
      const resp = API.upload(myUpParam, TIP)
      return resp
    }

    throw util.error('Upload')
  },

  /**
   * 远程下载
   */
  async remoteDownload(context) {
    const { state: { API, MAP, param, downParam, refTable }, getters: { GETTER } } = context
    const TIP = API.transTip(MAP.tipDown, this.state.API) // 拼上根模块 API 的菜单
    const myDownParam = await API.transDownParam(downParam, context)

    if (API.download) {
      const resp = API.download(myDownParam, TIP)
      return resp
    }

    // 优先取复选框数据
    let arr = param.rowList || []

    // 为空再查询全列表
    if (!arr.length && API.getList) {
      const myParam = await API.transParam(param, context)
      const resp = await API.getList({ ...myParam, ...myDownParam }, TIP)
      arr = API.transList(resp[1], context)
    }

    // 获取文件名
    const fileName = downParam.fileName || GETTER.fileName || CORE.fileName()
    refTable.export(fileName, arr)
  },

  /**
   * 远程上传进度
   */
  async remoteUpProgress() {
    throw util.error('UpProgress')
  },

  /**
   * 远程下载进度
   */
  async remoteDownProgress() {
    throw util.error('DownProgress')
  },
}

// ============================== 导出仓库 ============================== //

export default { state, getters, mutations, actions }
